﻿namespace FinalSilverlightProject
{
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Navigation;
    using FinalSilverlightProject.LoginUI;
    using System.ServiceModel.DomainServices.Client.ApplicationServices;
    using System;

    /// <summary>
    /// <see cref="UserControl"/> class providing the main UI for the application.
    /// </summary>
    public partial class MainPage : UserControl
    {
        /// <summary>
        /// Creates a new <see cref="MainPage"/> instance.
        /// </summary>
        public MainPage()
        {
            InitializeComponent();
            WebContext.Current.Authentication.LoggedIn += Authentication_LoggedIn;
            WebContext.Current.Authentication.LoggedOut += Authentication_LoggedOut;

        }

        void Authentication_LoggedIn(object sender, AuthenticationEventArgs e)
        {
            if (e.User.IsInRole("Administrators")) this.ContentFrame.Navigate(new Uri("/Administrator/Accounts", UriKind.Relative));
            if (e.User.IsInRole("Customers")) this.ContentFrame.Navigate(new Uri("/Home", UriKind.Relative));
            if (e.User.IsInRole("Managers")) this.ContentFrame.Navigate(new Uri("/Manager/Categories", UriKind.Relative));
            if (e.User.IsInRole("Stockmans")) this.ContentFrame.Navigate(new Uri("/Stockman/Orders", UriKind.Relative));
        }
        void Authentication_LoggedOut(object sender, AuthenticationEventArgs e)
        {
            this.ContentFrame.Navigate(new Uri("/Home", UriKind.Relative));
        }

        /// <summary>
        /// After the Frame navigates, ensure the <see cref="HyperlinkButton"/> representing the current page is selected
        /// </summary>
        private void ContentFrame_Navigated(object sender, NavigationEventArgs e)
        {
            StackPanel stackMain = (StackPanel)MainNavigationBar.Content;
            foreach (StackPanel stackChild in stackMain.Children)
            {
                foreach (UIElement child in stackChild.Children)
                {
                    HyperlinkButton hb = child as HyperlinkButton;
                    if (hb != null && hb.NavigateUri != null)
                    {
                        if (hb.NavigateUri.ToString().Equals(e.Uri.ToString()))
                        {
                            VisualStateManager.GoToState(hb, "ActiveLink", true);
                        }
                        else
                        {
                            VisualStateManager.GoToState(hb, "InactiveLink", true);
                        }
                    }
                }
            }
        }

        /// <summary>
        /// If an error occurs during navigation, show an error window
        /// </summary>
        private void ContentFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            e.Handled = true;
            ErrorWindow.CreateNew(e.Exception);
        }

        private void ContentFrame_Navigating(object sender, NavigatingCancelEventArgs e)
        {
            string uriString = e.Uri.ToString().ToLower();

            if (WebContext.Current.User.IsInRole("Administrators"))
            {
                if (!uriString.Contains("administrator"))
                {
                    e.Cancel = true;
                }
            }
            if (WebContext.Current.User.IsInRole("Managers"))
            {
                if (!uriString.Contains("categories") && !uriString.Contains("products"))
                {
                    e.Cancel = true;
                }
            }
            if (WebContext.Current.User.IsInRole("Stockmans"))
            {
                if (!uriString.Contains("orders"))
                {
                    e.Cancel = true;
                }
            }
        }
    }
}